package org.aerie.forest.core.frame.rebar.factory;

import org.aerie.forest.core.brick.exception.custom.runtime.ForestStorageException;
import org.aerie.forest.core.frame.rebar.AbstractForestSingleFrame;
import org.aerie.forest.core.frame.rebar.entity.AbstractForestRebar;
import org.aerie.forest.core.genericity.ContainsGenericity;

/**
 * @description forest货架
 *
 * @author quark
 * @organization aerie
 * @date 2020年2月20日 下午3:09:02
 * @version 1.2.0
 */
public abstract class ForestShelf extends AbstractForestSingleFrame {

	/**
	 * @description 类别【没有校验该泛型是不是存在于ForestRebarContainerCategory对应的容器里面】T的限定也没有处理
	 * @param <T> forest架构元素的泛型
	 *
	 * @author quark
	 * @organization aerie
	 * @date 2020年2月20日 下午3:09:17
	 * @version 1.2.0
	 */
	protected abstract class RebarScutcheon<T extends AbstractForestRebar> implements ContainsGenericity<T> {

		/**
		 * @description 架构元素类
		 * 
		 * @author quark
		 * @date 2020年2月20日 下午3:10:14
		 * @version 1.2.0
		 */
		private Class<T> forestRebarClass;

		/**
		 * Construction
		 * 
		 *
		 * @author quark
		 * @date 2020年5月9日 下午12:04:54
		 * @version 1.2.0
		 */
		public RebarScutcheon() {
			super();
			forestRebarClass = this.getGenericityZclass();
		}

		/**
		 * @description 获得货架标牌的架构元素的类
		 * @return 架构元素的类
		 *
		 * @date 2020年2月20日 下午3:55:10
		 * @version 1.2.0
		 */
		public Class<T> getForestRebarClass() {
			return forestRebarClass;
		}

		/**
		 * @description 获得架构元素的入库组件
		 * @return 架构元素的入库组件
		 *
		 * @date 2020年2月20日 下午3:55:33
		 * @version 1.2.0
		 */
		public final ForestRebarStorage getForestRebarStorage() {
			String storageName = getForestRebarClass().getName() + "Storage";
			try {
				// 获得入库组建的单例对象,并反射调用静态方法获取入库组件单例对象
				return (ForestRebarStorage) StorageBuilder.INSTANCE.buildStorage(forestRebarClass)
						.getMethod("yaoZaiJuan").invoke(null);
			} catch (NoSuchMethodException e) {
				throw new ForestStorageException("无法找到：【" + storageName + "】入库组件的获取单例对象的方法", e);
			} catch (Exception e) {
				throw new ForestStorageException("入库组件： 【" + storageName + "】的获取单例对象的方法不合法", e);
			}
		}
	}

	protected ForestShelf(String selfName) {
		super(selfName);
	}

	/**
	 * @description forest架构元素货架合法性判断
	 * @return 合法标识符
	 *
	 * @date 2020年2月20日 下午3:56:37
	 * @version 1.2.0
	 */
	public final boolean isLegal() {
		// TODO
		return false;
	}
}
